package com.zhouxiaoxuan13.consumer.feign;

import com.zhouxiaoxuan13.consumer.dto.FreshProduct;
import com.zhouxiaoxuan13.consumer.feign.fallback.FreshProductServiceFallback;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 生鲜商品服务Feign客户端
 * 使用OpenFeign实现微服务间的接口调用
 * 集成负载均衡、熔断器和容错机制
 */
@FeignClient(
    name = "promotion-service",           // 服务名称，与Consul中注册的服务名一致
    path = "/api/fresh-products",        // 服务的基础路径
    fallback = FreshProductServiceFallback.class,  // 降级处理类
    contextId = "freshProductServiceClient"  // 唯一标识符，避免Bean冲突
)
public interface FreshProductServiceClient {

    /**
     * 获取所有生鲜商品
     * @return 生鲜商品列表
     */
    @GetMapping
    ResponseEntity<List<FreshProduct>> getAllFreshProducts();

    /**
     * 根据ID获取单个生鲜商品
     * @param id 商品ID
     * @return 生鲜商品信息
     */
    @GetMapping("/{id}")
    ResponseEntity<FreshProduct> getFreshProductById(@PathVariable("id") Long id);

    /**
     * 根据名称搜索生鲜商品
     * @param name 商品名称
     * @return 匹配的生鲜商品列表
     */
    @GetMapping("/search")
    ResponseEntity<List<FreshProduct>> searchFreshProducts(@RequestParam("name") String name);

    /**
     * 根据种类获取生鲜商品
     * @param category 商品种类
     * @return 该种类的生鲜商品列表
     */
    @GetMapping("/category/{category}")
    ResponseEntity<List<FreshProduct>> getFreshProductsByCategory(@PathVariable("category") String category);

    /**
     * 获取所有促销商品
     * @return 促销商品列表
     */
    @GetMapping("/promotions")
    ResponseEntity<List<FreshProduct>> getPromotionProducts();

    /**
     * 获取库存预警商品
     * @param threshold 库存阈值，默认为10
     * @return 低库存商品列表
     */
    @GetMapping("/low-stock")
    ResponseEntity<List<FreshProduct>> getLowStockProducts(@RequestParam(value = "threshold", defaultValue = "10") Integer threshold);

    /**
     * 创建新的生鲜商品
     * @param freshProduct 生鲜商品信息
     * @return 创建的生鲜商品信息
     */
    @PostMapping
    ResponseEntity<FreshProduct> createFreshProduct(@RequestBody FreshProduct freshProduct);

    /**
     * 更新生鲜商品
     * @param id 商品ID
     * @param freshProductDetails 更新的商品信息
     * @return 更新后的商品信息
     */
    @PutMapping("/{id}")
    ResponseEntity<FreshProduct> updateFreshProduct(@PathVariable("id") Long id, @RequestBody FreshProduct freshProductDetails);

    /**
     * 删除生鲜商品
     * @param id 商品ID
     * @return 删除结果
     */
    @DeleteMapping("/{id}")
    ResponseEntity<Void> deleteFreshProduct(@PathVariable("id") Long id);
}
